87장. CloudTrail — 변경 추적
이 장에서 말하고자 하는 것
지금까지 본 관측성 도구는 사용자 트래픽 의 이야기를 다뤘다.
- 메트릭 — 시스템 숫자
- 로그 — 애플리케이션 이야기
- 트레이스 — 요청 흐름
또 하나가 남아 있다.
“AWS 환경 안에서 누가 무엇을 했는가”
이걸 기록하는 도구가
AWS CloudTrail
이다.
1. CloudTrail이 기록하는 것
AWS API 호출을 모두 기록한다.
이벤트 예:
- 누가 : User / Role / Service
- 언제 : 2026-01-01T10:23:45Z
- 어디서 : 13.124.55.21 (소스 IP)
- 무엇을 : RunInstances · CreateBucket · UpdateService …
- 어떤 자원에 : i-..., bucket=...
- 결과 : 성공 / 실패 / Access Denied
- 콘솔 클릭도 결국 API 호출이므로 모두 기록된다
- IAM Role을 받은 워크로드의 호출도 기록된다
2. 두 종류의 이벤트
Management Events
인프라/계정 변경.
- EC2 시작/정지
- IAM Role 만들기
- S3 버킷 생성
- VPC 변경
기본으로 켜져 있다 (90일까지 콘솔 검색 가능).
Data Events
자원 안의 데이터 작업.
- S3 객체 PUT / GET
- Lambda Invoke
- DynamoDB GetItem · PutItem
기본으로는 안 켜진다 (양이 많고 비용 큼).
필요한 경우만 켠다.
3. Trail — 영구 보관과 분석
CloudTrail의 기본 보관은 90일이다.
장기 보관 / 분석을 위해 Trail 을 만든다.
Trail "all-management"
├─ S3 버킷에 자동 적재
├─ CloudWatch Logs로도 흘려보냄 (선택)
└─ Multi-region 켜기
- S3에는 영구 보관 (수년)
- Athena 로 SQL 질의 가능
- 보안 분석 도구 (GuardDuty 등) 의 입력
4. 왜 필요한가
1. 사고 추적
“어제 운영 RDS가 왜 삭제됐지?”
→ CloudTrail로 누가 언제 DeleteDBInstance 호출했는지 추적.
2. 감사 / 컴플라이언스
ISO · SOC2 · PCI 같은 표준은 변경 이력 보관을 요구한다.
3. 보안 사고 대응
계정이 탈취되었다면 어떤 권한이 어떤 행위를 했는지 봐야 한다.
4. 권한 사용 분석
“이 Role이 실제로 어떤 Action 만 호출했나” 를 보고 정책을 좁힌다 (80장).
5. CloudTrail Lake — SQL로 질의
CloudTrail 이벤트를 직접 SQL로 검색하는 관리형 데이터 스토어.
SELECT eventTime, userIdentity.arn, eventName, requestParameters
FROM <event-data-store>
WHERE eventName = 'DeleteDBInstance'
AND eventTime > '2026-01-01'
S3에 적재된 로그를 Athena로 질의하는 것보다 즉시성이 좋다.
6. 보안 관련 통합
CloudTrail은 단독으로는 큰 가치가 없을 수 있다.
다음 서비스와 함께 가치를 발휘한다.
- GuardDuty — 비정상 패턴 자동 탐지 (사용자 비활성, 외부 국가에서 호출 등)
- Security Hub — 여러 보안 신호 통합
- AWS Config — 자원의 상태 변경 추적 (compliance 평가)
“CloudTrail은 일기, GuardDuty는 일기를 보고 사고를 찾는 형사”
7. 우리 서비스에서
[CloudTrail]
├─ Trail "prod-all"
│ ├─ Management Events: ON
│ ├─ Multi-region: ON
│ ├─ Log file validation: ON
│ └─ S3 bucket: msa-prod-cloudtrail (Object Lock + KMS)
├─ Data Events on critical buckets only
└─ CloudWatch Logs → 일정 패턴에 알람
[GuardDuty]: 켬
[Security Hub]: 켬
[AWS Config]: 핵심 자원 추적 ON
운영 사고가 났을 때 “누가 무엇을 했나” 를 시간 단위로 추적 가능.
8. 직접 확인해보기 — CLI
최근 이벤트 조회 (콘솔에서 보던 그것)
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=DeleteDBInstance \
--max-results 10
Trail 만들기
aws cloudtrail create-trail \
--name prod-all \
--s3-bucket-name msa-prod-cloudtrail \
--is-multi-region-trail \
--enable-log-file-validation \
--kms-key-id alias/cloudtrail
aws cloudtrail start-logging --name prod-all
Trail 상태
aws cloudtrail get-trail-status --name prod-all
9. 코드로는 이렇게 생겼다 — Terraform
resource "aws_s3_bucket" "cloudtrail" {
bucket = "msa-prod-cloudtrail"
}
resource "aws_s3_bucket_versioning" "cloudtrail" {
bucket = aws_s3_bucket.cloudtrail.id
versioning_configuration { status = "Enabled" }
}
resource "aws_s3_bucket_object_lock_configuration" "cloudtrail" {
bucket = aws_s3_bucket.cloudtrail.id
rule {
default_retention {
mode = "GOVERNANCE"
days = 365
}
}
}
resource "aws_cloudtrail" "main" {
name = "prod-all"
s3_bucket_name = aws_s3_bucket.cloudtrail.id
is_multi_region_trail = true
enable_log_file_validation = true
include_global_service_events = true
kms_key_id = aws_kms_key.cloudtrail.arn
event_selector {
read_write_type = "All"
include_management_events = true
# 핵심 버킷의 Data Events만 켬
data_resource {
type = "AWS::S3::Object"
values = ["${aws_s3_bucket.uploads.arn}/"]
}
}
}
Object Lock + 별도 계정으로 복제 → 악의적 삭제로부터 보호.
10. 이렇게 쓰면 망한다 — 안티패턴
안티패턴 1. CloudTrail을 안 켠다
사고가 나도 누가 했는지 모른다.
모든 운영 계정에 켠다 (Organizations 전체에 켜는 게 표준)
안티패턴 2. Trail S3 버킷이 누구나 만질 수 있다
악의적 사용자가 흔적을 지울 수 있다.
Object Lock + 별도 보안 계정 복제
안티패턴 3. Data Events 를 무차별 켠다
S3 GET 마다 이벤트가 발생 → 비용 폭증.
핵심 자원에만
안티패턴 4. 로그만 모으고 알람이 없다
누가 IAM Role을 만들거나 보안 그룹을 풀어도 모른다.
핵심 이벤트는 CloudWatch Alarm 또는 EventBridge Rule로 알람
11. 한 줄로 정리
CloudTrail은 AWS 안의 모든 행위를 기록하는 일기이며,
Multi-region · Object Lock · 알람 세 가지가 운영의 출발선이다
12. 이 장의 핵심 정리
- CloudTrail은 AWS API 호출의 누가·언제·무엇·어디를 기록한다.
- Management Events는 기본 ON, Data Events는 필요한 자원만.
- Trail로 S3에 영구 보관 + KMS · Object Lock으로 보호한다.
- GuardDuty · Security Hub · Config 와 함께 가치가 커진다.
- 핵심 이벤트 (IAM 변경 · SG 변경 · 삭제 작업) 는 알람으로 연결한다.
- CloudTrail이 없으면 사고 대응이 불가능에 가깝다.